import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pd.set_option('display.max_columns', None)
spr = 1
spc = 1
spn = 0
plt.figure(figsize=[8, 8])

# 1.	根据身体测量特征，利用skearn中的高斯贝叶斯模型判断一个人是男性还是女性。以下是训练样本的数据集，预测样本身高为6英尺，体重为130磅，脚掌8英寸的某人，预测其性别并输出。
# (1)	数据导入
# ①	读取数据GaussianNB.txt（10分）
df = pd.read_csv('GaussianNB.txt', header=None)

# ②	将数据且分为x，y（10分）
x = df.iloc[:, :-1]
y = df.iloc[:, -1]

# (2)	数据预处理
# ①	将y标签使用标签化进行处理（10分）
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
y = enc.fit_transform(y)

# (3)	模型训练
# ①	创建高斯贝叶斯（10分）
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()

# ②	拟合数据（10分）
model.fit(x, y)

# (4)	模型评估
# ①	x = [[6,130,8]]预测数据结果（（10分）
h = model.predict([[6,130,8]])
print(f'x = [[6,130,8]]预测数据结果: {enc.classes_[h]}')

# ②	计算该模型准确率（10分）
from sklearn.metrics import accuracy_score, classification_report, roc_curve, roc_auc_score
h = model.predict(x)
print(f'模型准确率: {accuracy_score(y, h)}')

# ③	打印分类报告（10分）
print('分类报告')
print(classification_report(y, h))

# ④	绘制roc曲线（10分）
fpr, tpr, thre = roc_curve(y, h)
spn += 1
plt.subplot(spr, spc, spn)
plt.plot(fpr, tpr)
for i, th in enumerate(thre):
    plt.annotate(f'{th:.2f}', xy=[fpr[i], tpr[i]])

# ⑤	输出auc数值（10分）
print(f'auc数值: {roc_auc_score(y, h)}')

# finally show all drawings
plt.show()
